from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework import viewsets

from BYD_ERP.utils.base_views import MultipleDestroyMixin, MultipleOpenMixin
from BYD_ERP.utils.pagination import GlobalPagination
from goods_info.models import GoodsCategoryModel
from goods_info.serializer.goods_category_serializer import GoodsCategorySerializer


class GoodsCategoryView(viewsets.ModelViewSet, MultipleDestroyMixin, MultipleOpenMixin):
    """
        create:
        货品（存货档案）类别信息--新增

        货品（存货档案）类别信息新增，status：201（成功），return：新增货品（存货档案）类别信息

        destroy:
        货品（存货档案）类别信息--删除

        货品（存货档案）类别信息删除，status：204（成功），return：None

        multiple_delete:
        货品（存货档案）类别信息--批量删除，必传参数：ids=[1,2,3,4……]

        货品（存货档案）类别信息批量删除，status：204（成功），return：None

        multiple_open:
        货品（存货档案）类别信息--批量启用或者禁用，必传（json）参数：ids=[1,2,3,4……]（列表中可以只有一个参数），is_open=1/0

        {
            "ids": [1,2],
            "is_open": "0"
        }
        is_open=1表示禁用，is_open=0表示启用
        货品（存货档案）类别信息批量启用或者禁用，status：204（成功），return：None

        update:
        货品（存货档案）类别信息--修改

        货品（存货档案）类别信息修改，status：200（成功），return：修改后的货品（存货档案）类别信息

        partial_update:
        货品（存货档案）类别信息--局部修改，可以传任意属性的值，服务器会修改指定的属性值

        货品（存货档案）类别信息局部修改，status：200（成功），return：修改后的货品（存货档案）类别信息

        list: 查询所有的顶级类别
        货品（存货档案）类别信息--获取分页列表，可选get请求参数：pid，如果没有传则查询顶级类别，否则查询指定pid下的子类别

        货品（存货档案）类别信息列表信息，status：200（成功），return：货品（存货档案）类别信息列表

        retrieve:
        查询某一个货品（存货档案）类别信息

        查询指定ID的货品（存货档案）类别信息，status：200（成功），return：指定货品（存货档案）类别信息

    """
    queryset = GoodsCategoryModel.objects.all()
    serializer_class = GoodsCategorySerializer
    pagination_class = GlobalPagination

    def get_queryset(self):
        if self.action == 'list':  # 先判断是查询顶级类别还是子类别
            # 获取请求参数（在get中）：pid
            pid = self.request.query_params.get('pid', None)
            if pid and pid != '0':
                return GoodsCategoryModel.objects.filter(parent_id=int(pid)).all()
            else:
                return GoodsCategoryModel.objects.filter(parent__isnull=True).all()

        else:
            return GoodsCategoryModel.objects.all()

    pid_param = openapi.Parameter(name='pid', in_=openapi.IN_QUERY, description='父类别的ID，可以不传，查询所有顶级父类别',
                                  type=openapi.TYPE_INTEGER)

    @swagger_auto_schema(manual_parameters=[pid_param], operation_description="商品类别的列表")
    def list(self, request, *args, **kwargs):
        return super(GoodsCategoryView, self).list(request=request, *args, **kwargs)
